package com.situ.gcbs.server.service;

import com.situ.gcbs.server.model.Member;
import com.situ.gcbs.server.model.searchbean.MemberSearchBean;
import com.situ.gcbs.server.util.PaginateInfo;

import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;

/**
 * 功能：
 *
 * @author 千堆雪
 * @version 1.0.0
 * @since 2024/5/16
 * <p>
 * created by 千堆雪 on 2024/5/16 10:20, last modified by 千堆雪 on 2024/5/16 10:20
 */
public interface MemberService {
    /**
     * @param pi  分页对象
     * @param msb 会员查询实体
     * @return 查询会员的行数
     */
    List<Member> findAll(PaginateInfo pi, MemberSearchBean msb);

    /**
     * 根据id批量查询
     *
     * @param ids 要批量查询的id集合
     * @return 所有会员实体
     */
    default List<Member> findByIds(Integer[] ids) {
        MemberSearchBean msb = new MemberSearchBean();
        msb.setIds(ids);
        return findAll(PaginateInfo.max(), msb);
    }

    /**
     * 批量删除
     *
     * @param ids       要删除的id集合
     * @param force     是否要强制删除
     * @param predicate 断言数组，断言成立则不允许删除
     * @return 成功删除的行数
     */
    int deleteByIds(Integer[] ids, boolean force, boolean logic, Predicate<Member> predicate);

    default int deleteByIds(Integer[] ids, boolean force, boolean logic) {
        Objects.requireNonNull(ids);
        return deleteByIds(ids, force, logic, t -> false);
    }

    /**
     * 批量物理删除
     *
     * @param ids   要删除的id集合
     * @param force 是否强制删除
     * @return 成功删除的行数
     */
    default int deleteByIds(Integer[] ids, boolean force) {
        Objects.requireNonNull(ids);
        return deleteByIds(ids, force, false);
    }

    /**
     * 强制批量物理删除
     *
     * @param ids 要删除的id集合
     * @return 成功删除的行数
     */
    default int deleteByIds(Integer[] ids) {
        Objects.requireNonNull(ids);
        return deleteByIds(ids, true);
    }

    /**
     * 根据id物理删除会员
     *
     * @param id 要删除的会员id
     * @return 成功删除的行数
     */
    default int deleteById(Integer id) {
        Objects.requireNonNull(id);
        return deleteByIds(new Integer[]{id});
    }

    /**
     * 物理删除会员实体
     *
     * @param member 会员实体，id不可为空
     * @return 成功删除的行数
     */
    default int delete(Member member) {
        Objects.requireNonNull(member);
        return deleteById(member.getId());
    }

    /**
     * 保存会员实体
     *
     * @param member 会员实体
     * @return 是否操作成功
     */
    boolean save(Member member);

    /**
     * 修改会员实体
     *
     * @param member 会员实体
     * @return 是否操作成功
     */
    boolean update(Member member);

    /**
     * 部分修改会员实体
     *
     * @param member 会员实体
     * @return 是否操作成功
     */
    boolean patch(Member member);
}
